package com.itbaizhan;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/*在实现文件下载时，我们需要在响应头中添加附加信息。
response.addHeader("Content-Disposition", "attachment; filename="+文件名);
Content-Disposition:attachment
该附加信息表示作为对下载文件的一个标识字段。不会在浏览器中显示而是直接做下载处理。
filename=文件名
表示指定下载文件的文件名。*/

/*解决文件名中文乱码问题
resp.addHeader("Content-Disposition","attachment;filename="+new
String(file.getName().getBytes("gbk"),"iso-8859-1"));*/
public class FileDownServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //读取下载文件
        //File file = new File("e:/picture/2001.png");

        //如果文件名是中文会出现乱码
        File file = new File("e:/picture/端砚.jpg");
        System.out.println(file.getName());
        //创建文件类型输入
        InputStream is = new FileInputStream(file);
        //创建缓冲  如果文件大，改为byte[1024],再while循环读取
        byte[] buff = new byte[is.available()];
        //将文件读进缓存
        is.read(buff);

        //在响应中添加附加信息   setHeader()功能也一样
       // resp.addHeader("Content-Disposition","attachment;filename="+file.getName());

        //解决文件名乱码
        /*Servlet在响应时是字节形响应，所以中文出现乱码，将中文的文件名，按操作系统gbk编码按字节转化，最后按"iso-8859-1"
        * 编码处理，生成字符串，再变成字节响应给浏览器*/
        resp.addHeader("Content-Disposition","attachment;filename="+new String(file.getName().getBytes("gbk"),"iso-8859-1"));
        //产生响应
        OutputStream os = resp.getOutputStream();
        os.write(buff);
        os.flush();
        os.close();
    }
}
